package com.qtt.app.controller;

import com.qtt.app.common.ApiResponse;
import com.qtt.app.entity.*;
import com.qtt.app.entity.ReturnInfo.*;
import com.qtt.app.service.AppCourseService;
import com.qtt.app.service.OrderFormService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.qtt.app.entity.RequestData.*;

import java.util.List;

@Api(tags = "课程管理", description = "CourseController")   //tags是api名字，description是简介，value:已废用
@RestController
@RequestMapping("/Course")
public class AppCourseController {
    @Autowired
    AppCourseService appCourseService;
    @Autowired
    OrderFormService orderFormService;//为了从订单表中获取已经报名的课程


    @ApiOperation(value = "查询所有课程", notes = "可以查课程表中的所有数据")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/list")
    public ApiResponse<List<ReturnTotalCourseInfo>> listall(){
        appCourseService.getAllAppCourseInfo();
        List<ReturnTotalCourseInfo> entities = appCourseService.getAllAppCourseInfo();
        if(entities.size()==0){return ApiResponse.<List<ReturnTotalCourseInfo>>builder().code(400).message("目前该表中没有数据").data(entities).build();}
        return ApiResponse.<List<ReturnTotalCourseInfo>>builder().code(200).message("查看成功").data(entities).build();
    }

    @ApiOperation(value = "通过主键id查看app_course表中的一条记录", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/list/{id}")
    public ApiResponse<ReturnTotalCourseInfo> getCourseById(@ApiParam(value="主键id",required = true) @PathVariable(value="id",required=true) Integer id){
        ReturnTotalCourseInfo entity = appCourseService.getCourseById(id);
        if(entity==null){return ApiResponse.<ReturnTotalCourseInfo>builder().code(400).message("目前该表中没有该数据，请检查输入的主键id").data(entity).build();}
        return ApiResponse.<ReturnTotalCourseInfo>builder().code(200).message("查看成功").data(entity).build();
    }

    @ApiOperation(value = "通过机构id查看机构的所有课程(机构详情页)", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/InstCourseList")
    public ApiResponse<List<ReturnTotalCourseInfo>> getInstCourseByInstId(@ApiParam(value="机构id",required = true) @RequestParam(value="institutionId",required=true) Integer institutionId){
        List<ReturnTotalCourseInfo> entities = appCourseService.getInstitutionCourseByInstId(institutionId);
        if(entities.size()==0){return ApiResponse.<List<ReturnTotalCourseInfo>>builder().code(400).message("该机构并没有课程数据").data(entities).build();}
        return ApiResponse.<List<ReturnTotalCourseInfo>>builder().code(200).message("查看成功").data(entities).build();
    }

    @ApiOperation(value = "通过讲师id查看该讲师的所有课程(讲师详情页)", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/TeacherCourseList")
    public ApiResponse<List<GeneralCourse>> getTeacherCourseByInstId(@ApiParam(value="讲师id",required = true) @RequestParam(value="teacherId",required=true) Integer teacherId){
        List<GeneralCourse> entities = appCourseService.getTeacherCourseByTeacherId(teacherId);
        if(entities.size()==0){return ApiResponse.<List<GeneralCourse>>builder().code(400).message("该讲师并没有课程数据").data(entities).build();}
        return ApiResponse.<List<GeneralCourse>>builder().code(200).message("查看成功").data(entities).build();
    }

//    添加数据接口的实现方法1
//    @ApiOperation(value = "在原后台的添加课程后调用该接口，往app_course添加课程的补充字段", notes = "意在让app_course表和general_course表对应起来。需要在原后台系统的添加课程后继续调用该接口，获取到最新插入general_course表的id，并补充几个字段到app_course表。title的作用是获取最新的那条general_course记录并判断标题是否一样，确保修改的就是最新插入的")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
//    @PostMapping("/addAppCourseByGetLastId")
//    public ApiResponse<Integer> isConcernCourse(@ApiParam(value="请求参数解释:title课程标题;courseType课程类别;courseProgress课程开展进度(例：23%);institutionId机构id",required = true) @RequestBody(required=true) AddAppCourse requestData
//    ) {
//        //1，先用title去general_course表中查看该记录，建议标题唯一，这样就能找到刚添加的记录.从中拿到课程id
//        GeneralCourse generalCourseEntity = appCourseService.getLastEntity();
//        if(!generalCourseEntity.getTitle().equals(requestData.getTitle())){
//            return ApiResponse.<Integer>builder().code(400).message("添加失败，general_course表中最新添加的记录并不是此标题").data(null).build();
//        }
//        String courseId = generalCourseEntity.getId()+"1";
//        System.out.println("courseId="+courseId);
////        String generalId = courseId.substring(0,courseId.length() - 1);
//        //2，创建appcourse实体，设置参数.5个字段
//        AppCourseWithBLOBs appCourseEntity = new AppCourseWithBLOBs();
//        appCourseEntity.setCourseId(courseId);
//        appCourseEntity.setGeneralId(generalCourseEntity.getId());
//        appCourseEntity.setInstitutionId(requestData.getInstitutionId());
//        appCourseEntity.setCourseType(requestData.getCourseType());
//        appCourseEntity.setCourseProgress(requestData.getCourseProgress());
//        appCourseEntity.setChapterList(requestData.getChapterList());
//        appCourseEntity.setNoticeList(requestData.getNoticeList());
//        appCourseEntity.setSectionList(requestData.getSectionList());
//        appCourseEntity.setResourceList(requestData.getResourceList());
//
//        int id = appCourseService.addAppCourse(appCourseEntity);
//        Integer id2 = new Integer(id);
//        if(id!=0) {
//            return ApiResponse.<Integer>builder().code(200).message("添加成功，返回appCourseListId").data(id2).build();
//        }
//        return ApiResponse.<Integer>builder().code(400).message("添加失败，请检查输入").data(id2).build();
//    }

    @ApiOperation(value = "通过课程标题，往app_course添加一门课程(添加课程数据时使用)", notes = "web端添加课程后，还需使用该接口，将general_course表的记录和app_course表的数据绑定。意在让app_course表和general_course表对应起来。该方法直接用课程title从general_coourse表中查找到记录，然后加到app_course表中，因此标题必须唯一。")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @PostMapping("/addAppCourseByTitle")
    public ApiResponse<Integer> isConcernCourse2(@ApiParam(value="请求参数解释:title课程标题;courseType课程类别;courseProgress课程开展进度(例：23%);institutionId机构id",required = true) @RequestBody(required=true) AddAppCourse requestData
    ) {
        //1，先用title去general_course表中查看该记录，建议标题唯一，这样就能找到刚添加的记录.从中拿到课程id
        GeneralCourse generalCourseEntity = appCourseService.getGeneralCourseByTitle(requestData.getTitle());
        String courseId = generalCourseEntity.getId()+"1";
        System.out.println("courseId="+courseId);
//        String generalId = courseId.substring(0,courseId.length() - 1);
        //2，创建appcourse实体，设置参数.5个字段
        AppCourseWithBLOBs appCourseEntity = new AppCourseWithBLOBs();
        appCourseEntity.setCourseId(courseId);
        appCourseEntity.setGeneralId(generalCourseEntity.getId());
        appCourseEntity.setInstitutionId(requestData.getInstitutionId());
        appCourseEntity.setCourseType(requestData.getCourseType());
        appCourseEntity.setCourseProgress(requestData.getCourseProgress());
        appCourseEntity.setChapterList(requestData.getChapterList());
        appCourseEntity.setNoticeList(requestData.getNoticeList());
        appCourseEntity.setSectionList(requestData.getSectionList());
        appCourseEntity.setResourceList(requestData.getResourceList());
        appCourseEntity.setCourseGrade(requestData.getGrade());


        int id = appCourseService.addAppCourse(appCourseEntity);
        Integer id2 = new Integer(id);
        if(id!=0) {
            return ApiResponse.<Integer>builder().code(200).message("添加成功，返回appCourseListId").data(id2).build();
        }
        return ApiResponse.<Integer>builder().code(400).message("添加失败，请检查输入").data(id2).build();
    }


//    @ApiOperation(value = "添加一门课程（管理员端）", notes = "需要在原后台系统的添加课程基础上进行修改，多加几个字段，并修改.成功就返回app_course表的主键id，通过该id可以找到对应的课程记录。获取最新的那条记录并判断标题是否一样，确保修改的就是最新插入的")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
//    @PostMapping("/addAppCourse")
//    public ApiResponse<Integer> isConcernCourse(@ApiParam(value="课程标题，作为验证查找刚添加的记录",required = true) @RequestParam(value="title",required=true) String title,
////                                              @ApiParam(value="课程id",required = true) @RequestParam(value="courseId",required=true) String courseId,
//                                                @ApiParam(value="机构id",required = true) @RequestParam(value="institutionId",required=true) Integer institutionId,
//                                                @ApiParam(value="课程类别",required = true) @RequestParam(value="courseType",required=true) String courseType,
//                                                @ApiParam(value="课程开展进度",required = true) @RequestParam(value="courseProgress",required=true) String courseProgress
//                                               ) {
//        //1，先用title去general_course表中查看该记录，建议标题唯一，这样就能找到刚添加的记录.从中拿到课程id
//        GeneralCourse generalCourseEntity = appCourseService.getLastEntity();
//        if(!generalCourseEntity.getTitle().equals(title)){
//            return ApiResponse.<Integer>builder().code(400).message("添加失败，general_course表中最新添加的记录并不是此标题").data(null).build();
//        }
//        String courseId = generalCourseEntity.getId()+"1";
//        System.out.println("courseId="+courseId);
////        String generalId = courseId.substring(0,courseId.length() - 1);
//        //2，创建appcourse实体，设置参数.5个字段
//        AppCourse appCourseEntity = new AppCourse();
//        appCourseEntity.setCourseId(courseId);
//        appCourseEntity.setGeneralId(generalCourseEntity.getId());
//        appCourseEntity.setInstitutionId(institutionId);
//        appCourseEntity.setCourseType(courseType);
//        appCourseEntity.setCourseProgress(courseProgress);
//
//        int id = appCourseService.addAppCourse(appCourseEntity);
//        Integer id2 = new Integer(id);
//        if(id!=0) {
//            return ApiResponse.<Integer>builder().code(200).message("添加成功，返回appCourseListId").data(id2).build();
//        }
//        return ApiResponse.<Integer>builder().code(400).message("添加失败，请检查输入").data(id2).build();
//    }

//    //暂时不需要
//    @ApiOperation(value = "查看用户已经报名的课程", notes = "该接口是联合订单表中查询得到的。可用于评论课程列表和我的学习课程列表。如果用于评论课程列表，则isComment表示该订单课程是否已经评论，true为已评论，false为未评论。")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
//    @GetMapping("/myCourses")
//    public ApiResponse<List<ReturnCommentCourse>> getMyCourseList(@ApiParam(value="用户id",required = true) @RequestParam(value="userId",required=true) Long userId){
//        int orderState = 2;
//        List<ReturnCommentCourse> entities = orderFormService.getCommentCourse(userId,orderState);
//        if (entities.size() ==0) {//注意列表如果返回的是空，需要这么判断，空列表为[]
//            return ApiResponse.<List<ReturnCommentCourse>>builder().code(400).message("还没有购课").data(entities).build();
//        }
//        return ApiResponse.<List<ReturnCommentCourse>>builder().code(200).message("查看成功").data(entities).build();
//    }

    @ApiOperation(value = "依照类别查看课程(首页、课程页)", notes = "目前有8类，创业课程 内训课程 实战课程 上市辅导 财务管理 项目管理 人事管理 技术管理")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/TypeCourses")
    public ApiResponse<List<ReturnTotalCourseInfo>> getCourseListByType(@ApiParam(value="课程类型",required = true) @RequestParam(value="courseType",required=true) String courseType){
        List<ReturnTotalCourseInfo> entities = appCourseService.getCoursesByType(courseType);
        if (entities.size() ==0) {//注意列表如果返回的是空，需要这么判断，空列表为[]
            return ApiResponse.<List<ReturnTotalCourseInfo>>builder().code(400).message("该类别还没有课程").data(entities).build();
        }
        return ApiResponse.<List<ReturnTotalCourseInfo>>builder().code(200).message("查看成功").data(entities).build();
    }

    @ApiOperation(value = "按照关键词查询课程(首页)", notes = "目前关键词查询仅限于对课程名字的模糊查询，后续有时间再补充机构名、讲师名的模糊查询")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/SearchCourses")
    public ApiResponse<List<ReturnResearch>> searchCourses(@ApiParam(value="搜索关键词",required = true) @RequestParam(value="keyword",required=true) String keyword){

        List<ReturnResearch> entities = appCourseService.searchCourses(keyword);
        if (entities.size() ==0) {//注意列表如果返回的是空，需要这么判断，空列表为[]
            return ApiResponse.<List<ReturnResearch>>builder().code(400).message("没有搜索到相关课程").data(null).build();
        }
        return ApiResponse.<List<ReturnResearch>>builder().code(200).message("查看成功").data(entities).build();
    }


    @ApiOperation(value = "查看评分最高的top20课程(首页)", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/topCourses")
    public ApiResponse<List<ReturnTopCourses>> getTopCourseList(){
        List<ReturnTopCourses> entities = appCourseService.getTopCourses();
        if (entities.size() ==0) {//注意列表如果返回的是空，需要这么判断，空列表为[]
            return ApiResponse.<List<ReturnTopCourses>>builder().code(400).message("还没有购课").data(entities).build();
        }
        return ApiResponse.<List<ReturnTopCourses>>builder().code(200).message("查看成功").data(entities).build();
    }




}
